﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web;
using System.Text.RegularExpressions;

namespace ChoViet.Lib.Helpers
{
    public static class TextHelper
    {
        private static char[] SPECIAL_CHARACTERS = { ' ','À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò',
       'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê',
       'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ',
       'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ',
       'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', 'ằ',
       'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế',
       'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị',
       'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ',
       'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ',
       'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', 'Ử', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', };

       private static char[] REPLACEMENTS = { '-', 'A', 'A', 'A', 'A', 'E', 'E', 'E',
       'I', 'I', 'O', 'O', 'O', 'O', 'U', 'U', 'Y', 'a', 'a', 'a', 'a',
       'e', 'e', 'e', 'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'y', 'A',
       'a', 'D', 'd', 'I', 'i', 'U', 'u', 'O', 'o', 'U', 'u', 'A', 'a',
       'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A',
       'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e',
       'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'I',
       'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o',
       'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O',
       'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u',
       'U', 'u', };
       public static String ToUrlFriendly(this HtmlHelper helper, String s)
       {
           int maxLength = Math.Min(s.Length, 236);
           var strReturn = string.Empty;
           for (int i = 0; i < s.Length; i++)
           {
               char ch = s[i];
               int index =Array.IndexOf(SPECIAL_CHARACTERS, ch);
               if (index >= 0)
               {
                   strReturn += REPLACEMENTS[index];
               }
               else
               {
                   strReturn += ch;
               }
           }
           strReturn =Slugify(strReturn,255);
           return HttpUtility.HtmlEncode(strReturn.ToLower());
       }
       public static String ToUrlFriendly(String s)
       {
           int maxLength = Math.Min(s.Length, 236);
           var strReturn = string.Empty;
           for (int i = 0; i < s.Length; i++)
           {
               char ch = s[i];
               int index = Array.IndexOf(SPECIAL_CHARACTERS, ch);
               if (index >= 0)
               {
                   strReturn += REPLACEMENTS[index];
               }
               else
               {
                   strReturn += ch;
               }
           }
           strReturn = Slugify(strReturn, 255);
           return HttpUtility.HtmlEncode(strReturn.ToLower());
       }
       public static String ToUrlShort(String s)
       {
           var strReturn = string.Empty;
           string replace = string.Empty;
           string number = "0123456789";
           for (int i = s.Length - 1; i > 0; i--)
           {
               if (s[i] == '/' || (s[i] == '0' && !number.Contains(s[i - 1])))
               {
                   replace = s[i] + replace;
               }
               else
               {
                   break;
               }
           }
           strReturn = replace != string.Empty ? s.Substring(0, s.LastIndexOf(replace)) : s;
           return HttpUtility.HtmlEncode(strReturn.ToLower());
       }
       public static string Slugify(string phrase, int maxLength)
       {
           string str = phrase.ToLower();

           // invalid chars, make into spaces
           str = Regex.Replace(str, @"[^a-z0-9\s-]", "");
           // convert multiple spaces/hyphens into one space
           str = Regex.Replace(str, @"[\s-]+", " ").Trim();
           // cut and trim it
           str = str.Substring(0, str.Length <= maxLength ? str.Length : maxLength).Trim();
           // hyphens
           str = Regex.Replace(str, @"\s", "-");

           return str;
       }
    }
}
